#include<iostream>
#include"Task.hpp"
#include"BlockQueue.hpp"
#include<unistd.h>
using namespace std;

//-----------------------------Consumer与Productor模型----------------------------//
//为什么要有生产者，消费者模型？
// 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯，而
// 通过阻塞队列来进行通讯，所以生产者生产完数据之后不用等待消费者处理，直接扔给阻塞队列，消费者不找生产者
// 要数据，而是直接从阻塞队列里取，阻塞队列就相当于一个缓冲区，平衡了生产者和消费者的处理能力。这个阻塞队
// 列就是用来给生产者和消费者解耦的。
// 生产者消费者模型优点： 解耦，支持并发，支持忙闲不均

int cent=1;
void* Consumer(void *args)
{
    BlockQueue<Task>*bq=static_cast<BlockQueue<Task>*>(args);
    //BlockQueue<int>*bq=static_cast<BlockQueue<int>*>(args);
    while(true)
    {
        //int t=bq->Pop();
        //cout<<"拿走了一个数据："<<t<<endl;
        //sleep(1);
        //消费
        Task t = bq->Pop();
        std::cout << "消费了一个任务 " << std::endl;
        t.run();
        sleep(1);
    }

}
void* Productor(void *args)
{
    BlockQueue<Task>*bq=static_cast<BlockQueue<Task>*>(args);
    //BlockQueue<int>*bq=static_cast<BlockQueue<int>*>(args);
    int x = 10;
    int y = 20;
    while(true)
    {
        // bq->Push(cent++);
        // cout<<"进去了一个数据："<<cent-1<<endl;
        // sleep(1);
        //生产
       Task t(x, y);
        bq->Push(t);
        std::cout << "生产了一个任务 " << std::endl;
        sleep(1);
    }

}
int main()
{
    //BlockQueue<int>*bq=new BlockQueue<int>();
    //当然cp模型还也可以传递其他数据，比如对象？比如任务等等
    BlockQueue<Task>*bq=new BlockQueue<Task>();
  
    pthread_t c,p;
    pthread_create(&c,nullptr,Consumer,bq);
    pthread_create(&p, nullptr, Productor, bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    delete bq;
    return 0;
}